package com.wcity.manage.common.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 时间格式操作类
 *
 * @author Hanley
 */
public class DateUtil {

	/**
	 * 日期格式
	 */
	public static final String PAT_DATE = "yyyy-MM-dd";
	/**
	 * 完整日期格式
	 */
	public static final String PAT_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
	/**
	 * 字符串日期格式
	 */
	public static final String SIMPLE_DATE = "yyyyMMdd";
	/**
	 * 时间格式
	 */
	public static final String PAT_TIME = "HH:mm:ss";
	/**
	 * 字符串时间格式
	 */
	public static final String SIMPLE_TIME = "HHmmss";
	/**
	 * 完整格式
	 */
	public static final String SIMPLE = "yyyyMMddHHmmss";
	
	/**
	 * 返回日期格式
	 * @return
	 */
	public static String getDate(Date date) {
		return format(date, PAT_DATE);
	}
	
	/**
	 * 返回时间格式
	 * @return
	 */
	public static String getTime(Date date) {
		return format(date, PAT_TIME);
	}
	
	public static String getDateTime( Date date ) {
		return format( date, PAT_DATE_TIME );
	}
	
	/**
	 * 返回完整格式
	 * @return
	 */
	public static String getDateFormatPatter(Date date) {
		return format(date, SIMPLE);
	}
	
	/**
	 * 将字符串格式转换为日期格式
	 * @param strDate
	 * @return
	 * @throws java.text.ParseException
	 * @throws Exception 
	 */
	public static Date strToDate(String strDate) throws ParseException {
		return parse(strDate, PAT_DATE);
	}

	/**
	 * 将字符串格式转换为时间格式
	 * @param strTime
	 * @return
	 * @throws java.text.ParseException
	 */
	public static Date strToTime(String strTime) throws ParseException {
		return parse(strTime, PAT_TIME);
	}

	/**
	 * 将字符串格式转换为日期全格式
	 * @param strDate
	 * @return
	 * @throws java.text.ParseException
	 * @throws Exception
	 */
	public static Date strToDateTime(String strDate) throws ParseException {
		return parse(strDate, PAT_DATE_TIME);
	}
	
	/**
	 * 使用参数格式化date为字符串
	 * @param date
	 * @param patter
	 * @return
	 */
	public static String format(Date date, String patter) {
		return null == date ? "" : new SimpleDateFormat(patter).format(date);
	}
	
	/**
	 * 严格按照patter参数格式检验数据
	 * @param obj
	 * @param patter
	 * @return
	 */
	public static boolean checkDate(String obj, String patter) {
		if (obj != null) {
			try {
				SimpleDateFormat sdf = new SimpleDateFormat(patter);
				sdf.setLenient(false);
				sdf.parse(obj);
			} catch (ParseException e) { return false; }
			return true;
		}
		return false;
	}
	
	/**
	 * 将字符串转换为预设日期格式
	 *
	 * @param strDate
	 * @param patter
	 * @return
	 * @throws java.text.ParseException
	 */
	public static Date parse(String strDate, String patter) throws ParseException {
		return strDate == null ? null : new SimpleDateFormat(patter).parse(strDate);
	}
	
	/**
	 * 返回date加上days天数后的日期yyyy-MM-dd
	 * 
	 * @param date
	 * @param days
	 * @return
	 */
	public static Date plusDays( Date date, int days ) {
		
		Calendar calendar = new GregorianCalendar();
		calendar.setTime( date );
		calendar.add( Calendar.DATE, days );
		return calendar.getTime(); 
	}
	
	/**
	 * 返回end到start的间隔天数
	 * 
	 * @param start
	 * @param end
	 * @return
	 */
	public static long decreaseDay( Date start, Date end ) {
		
	    Calendar fromCalendar = Calendar.getInstance();  
        fromCalendar.setTime( start );  
        fromCalendar.set( Calendar.HOUR_OF_DAY, 0 );  
        fromCalendar.set( Calendar.MINUTE, 0 );  
        fromCalendar.set( Calendar.SECOND, 0 );  
        fromCalendar.set( Calendar.MILLISECOND, 0 );  
  
        Calendar toCalendar = Calendar.getInstance();  
        toCalendar.setTime( end );  
        toCalendar.set( Calendar.HOUR_OF_DAY, 0 );  
        toCalendar.set( Calendar.MINUTE, 0 );  
        toCalendar.set( Calendar.SECOND, 0 );  
        toCalendar.set( Calendar.MILLISECOND, 0 );  
  
        return ( toCalendar.getTime().getTime() - fromCalendar.getTime().getTime() ) / ( 1000 * 60 * 60 * 24 ); 
	}
	
	/**
	 * 返回end到start的时间差(秒)
	 * 
	 * @param start
	 * @param end
	 * @return
	 */
	public static long decrease( Date start, Date end ) {
		return ( end.getTime() - start.getTime() ) / 1000;
	}

}